from django.shortcuts import render

from rest_framework.decorators import action
from rest_framework import viewsets  #导入视图集
from rest_framework.response import Response
from .serializers import StudentSerializer,ClassSerializer #导入序列化器
from .models import Student,Classes
from rest_framework.status import HTTP_404_NOT_FOUND,HTTP_204_NO_CONTENT #204执行成功(删除)，404是未找到资源

# Create your views here.
"""
    在序列化器转化后，
    视图集（方法）
    list 查询全部 create 增加 retrieve 查询单条 update 修改更新 destroy 删除
"""

#复杂的用这个，自己写
# class StudentViewset(viewsets.ViewSet):
#     def list(self,request):
#         students = Student.objects.all()  #返回的是所有学生的查询集
#         serializer = StudentSerializer(students,many=True) #把 查询集 转为 序列化器，如果是多条数据的操作，加上 many=True
#
#         return Response(serializer.data)  #加上 .data 表示做数据的展示
#     def create(self,request):
#         #获取前端传入的请求体并实例化序列化器，进行反序列化(把json数据转化为模型数据)
#         serializer = StudentSerializer(data=request.data)
#         #调用is_vaild进行校验
#         serializer.is_valid(raise_exception=True) #有异常就抛出异常
#         #调用save方法把数据保存到数据库 (object.create是直接创建，save是把接受的数据保存)
#         serializer.save()
#         #返回响应
#         return Response(serializer.data)
#
#     def retrieve(self,request,pk):  #查询单条数据
#         #根据参数获取具体的数据(根据id，但一般内部测试是pk)
#         try:
#             student = Student.objects.get(id=pk) #进行异常处理，因为get没接受到数据会报错
#         except Student.DoesNotExist: # DoesNotExist表示数据没找到的异常
#             return Response(status=HTTP_404_NOT_FOUND)
#
#         serializer = StudentSerializer(student)  #模型对象转json 序列化
#         return Response(serializer.data)
#
#     def update(self,request,pk):
#         #查询
#         try:
#             student = Student.objects.get(id=pk)
#         except Student.DoesNotExist:
#             return Response(status=HTTP_404_NOT_FOUND)
#         #反序列化  (因为需要从前端传入新的数据)
#         serializer = StudentSerializer(student,data=request.data)
#         #校验
#         serializer.is_valid(raise_exception=True)
#         #保存 update
#         serializer.save()
#         return Response(serializer.data)
#
#     def destroy(self,request,pk):
#         # 查询
#         try:
#             student = Student.objects.get(id=pk)
#         except Student.DoesNotExist:
#             return Response(status=HTTP_404_NOT_FOUND)
#
#         student.delete() #因为调用的是逻辑删除，所以需要重写此方法，不在序列化器里，要在模型类里写，因为调用的是模型类里的
#         return Response(HTTP_204_NO_CONTENT)

#标准增删改查可用此简便的办法，ModelViewSet
class StudentViewset(viewsets.ModelViewSet):  #学生视图集
    #定义视图集使用的查询集
    queryset = Student.objects.filter(is_delete=False) #查询is_delete为True的信息，也就是没有被逻辑删除的信息
    serializer_class = StudentSerializer #视图集使用的序列化器类

class ClassesViewset(viewsets.ModelViewSet): #班级视图集
    queryset = Classes.objects.filter(is_delete=False)
    serializer_class = ClassSerializer

    #加功能，例如下边这个查询最后一条数据， 所以需要写 @action(methods=[''],detail=)来添加上功能
    @action(methods=['get'],detail=False) #detail详情没有，如果需要传入参数(例pk)就改成True
    def last(self,request):  #写具体功能
        #查询班级最后一条数据
        classes = Classes.objects.last()
        #将查询出来的模型对象转化为json数据格式，然后进行返回
        return Response(self.get_serializer(classes).data)


